package com.sheng.leetcode.year2022.swordfingeroffer.day24;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/09/22
 *<p>
 * 剑指 Offer 14- I. 剪绳子<p>
 *<p>
 * 给你一根长度为 n 的绳子，请把绳子剪成整数长度的 m 段（m、n都是整数，n>1并且m>1），<p>
 * 每段绳子的长度记为 k[0],k[1]...k[m-1] 。<p>
 * 请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少？<p>
 * 例如，当绳子的长度是8时，我们把它剪成长度分别为2、3、3的三段，此时得到的最大乘积是18。<p>
 *<p>
 * 示例 1：<p>
 * 输入: 2<p>
 * 输出: 1<p>
 * 解释: 2 = 1 + 1, 1 × 1 = 1<p>
 *<p>
 * 示例2:<p>
 * 输入: 10<p>
 * 输出: 36<p>
 * 解释: 10 = 3 + 3 + 4, 3 ×3 ×4 = 36<p>
 * 提示：<p>
 *<p>
 * 2 <= n <= 58<p>
 * 注意：本题与主站 343 题相同：<a href="https://leetcode-cn.com/problems/integer-break/">...</a><p>
 *<p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/jian-sheng-zi-lcof">...</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class Sword0014 {

    @Test
    public void test01() {
//        int n = 2;
//        int n = 10;
        int n = 11;
        System.out.println(new Solution().cuttingRope(n));
    }
}
class Solution {
    public int cuttingRope(int n) {
        // 题目要求起码剪成两段
        // 找规律：
        // 例如11：拆成2 * 3 * 3 * 3最大
        // 得出一个数n，等于4的时候拆成2 * 2，等于3拆成1 * 2，等于2拆成1 * 1，而在大于等于5的时候，全部拆成3 * (n - 3)，然后n - 3这个值继续递归拆分
        if (n == 2) {
            return 1;
        } else if (n == 3) {
            return 2;
        } else if (n == 4) {
            return 4;
        } else {
            int ans = 1;
            while (n >= 5) {
                ans *= 3;
                n -= 3;
            }
            ans *= n;
            return ans;
        }
    }
}
